using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BingAuto
{
    public class CSVRecordManager
    {
        private string csvFilePath;
        // 文件锁对象，用于同步多线程对CSV文件的访问
        private static readonly object fileLock = new object();

        public CSVRecordManager(string filePath)
        {
            csvFilePath = filePath;

            // 如果文件不存在，创建并添加表头
            if (!File.Exists(csvFilePath))
            {
                // 指定 UTF-8 编码（无 BOM）
                using (StreamWriter sw = new StreamWriter(csvFilePath, append: false, encoding: new UTF8Encoding(false)))
                {
                    sw.WriteLine("UpdateDate,Title,Copyright,FilePath,ImageUrl");
                }
            }
        }

        // 写入一条新记录，按日期顺序插入，如果存在相同日期的记录则覆盖
        public void WriteRecord(BingServer.GetImageEventArgs args)
        {
            // 使用锁确保同一时间只有一个线程可以写入CSV文件
            lock (fileLock)
            {
                // 读取所有记录
                var lines = File.ReadAllLines(csvFilePath).ToList();
                bool recordFound = false;
                int insertIndex = 1; // 从第二行开始（第一行为表头）

                // 确保有数据（第一行为表头）
                if (lines.Count > 1)
                {
                    // 查找是否存在相同日期的记录
                    for (int i = 1; i < lines.Count; i++)
                    {
                        var fields = lines[i].Split(',');
                        if (fields.Length >= 5 && fields[0] == args.updateDate)
                        {
                            // 找到相同日期的记录，覆盖它
                            lines[i] = $"{args.updateDate},{args.title},{args.copyright},{args.fileName},{args.imageUrl}";
                            recordFound = true;
                            break;
                        }
                        // 计算新记录应该插入的位置以保持日期顺序
                        else if (!recordFound && fields.Length >= 5 && fields[0].CompareTo(args.updateDate) < 0)
                        {
                            insertIndex = i + 1;
                        }
                    }
                }

                // 如果没有找到相同日期的记录，按日期顺序插入
                if (!recordFound)
                {
                    // 如果插入位置超出了当前行数，直接添加到末尾
                    if (insertIndex >= lines.Count)
                    {
                        lines.Add($"{args.updateDate},{args.title},{args.copyright},{args.fileName},{args.imageUrl}");
                    }
                    else
                    {
                        // 否则插入到正确的位置
                        lines.Insert(insertIndex, $"{args.updateDate},{args.title},{args.copyright},{args.fileName},{args.imageUrl}");
                    }
                }

                // 写回所有记录
                File.WriteAllLines(csvFilePath, lines);
            }
        }


        // 读取所有历史记录
        public List<BingServer.GetImageEventArgs> ReadAllRecords()
        {
            List<BingServer.GetImageEventArgs> records = new List<BingServer.GetImageEventArgs>();
            
            try
            {
                if (!File.Exists(csvFilePath))
                {
                    return records;
                }
                
                // 使用锁确保同一时间只有一个线程可以读取CSV文件
                lock (fileLock)
                {
                    var lines = File.ReadAllLines(csvFilePath, Encoding.UTF8).ToList();
                    
                    // 确保有数据（第一行为表头）
                    if (lines.Count > 1)
                    {
                        // 从第二行开始读取数据行
                        for (int i = 1; i < lines.Count; i++)
                        {
                            var fields = lines[i].Split(',');
                            
                            // 确保字段数量符合要求
                            if (fields.Length >= 5)
                            {
                                records.Add(new BingServer.GetImageEventArgs(fields[0], fields[1], fields[2], fields[3], fields[4]));
                            }
                        }
                    }
                }
            }
            catch (Exception)
            {
                // 捕获异常但不抛出，避免程序崩溃
            }
            
            return records;
        }
        
        // 根据日期查找记录
        public BingServer.GetImageEventArgs FindRecordByDate(string date)
        {
            try
            {
                if (!File.Exists(csvFilePath))
                {
                    return null;
                }
                
                // 使用锁确保同一时间只有一个线程可以读取CSV文件
                lock (fileLock)
                {
                    var lines = File.ReadAllLines(csvFilePath, Encoding.UTF8).ToList();
                    
                    // 确保有数据（第一行为表头）
                    if (lines.Count > 1)
                    {
                        // 从第二行开始查找匹配的日期
                        for (int i = 1; i < lines.Count; i++)
                        {
                            var fields = lines[i].Split(',');
                            
                            // 确保字段数量符合要求
                            if (fields.Length >= 5 && fields[0] == date)
                            {
                                return new BingServer.GetImageEventArgs(fields[0], fields[1], fields[2], fields[3], fields[4]);
                            }
                        }
                    }
                }
            }
            catch (Exception)
            {
                // 捕获异常但不抛出，避免程序崩溃
            }
            
            return null;
        }
        

    }
}
